/**
 * 
 */
package com.ywm8.ywm.admin.action;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.RandomStringUtils;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.util.ServletContextAware;

/**
 * @author wangruishun
 * @version ywm8 1.0 2014-1-11 下午4:34:30
 */
public class CodeAction implements ServletContextAware {

	private HttpServletResponse response = ServletActionContext.getResponse();  
    private HttpServletRequest request = ServletActionContext.getRequest();  
  
    public String execute() {  
        try {  
            int width = 50;  
            int height = 18;  
            // 取得一个4位随机字母数字字符串  
            String s = RandomStringUtils.random(4, true, true);  
  
            // 保存入session,用于与用户的输入进行比较.  
            // 注意比较完之后清除session.  
            HttpSession session = request.getSession(true); 
            
            session.setAttribute("authCode", s);  
  
            response.setContentType("images/jpeg");  
            response.setHeader("Pragma", "No-cache");  
            response.setHeader("Cache-Control", "no-cache");  
            response.setDateHeader("Expires", 0);  
  
            ServletOutputStream out = response.getOutputStream();  
            BufferedImage image = new BufferedImage(width, height,  
                    BufferedImage.TYPE_INT_RGB);  
            Graphics g = image.getGraphics();  
            // 设定背景色  
            g.setColor(getRandColor(200, 250));  
            g.fillRect(0, 0, width, height);  
  
            // 设定字体  
            Font mFont = new Font("Times New Roman", Font.BOLD, 18);// 设置字体  
            g.setFont(mFont);  
  
            // 画边框  
            // g.setColor(Color.BLACK);  
            // g.drawRect(0, 0, width - 1, height - 1);  
  
            // 随机产生干扰线，使图象中的认证码不易被其它程序探测到  
            g.setColor(getRandColor(160, 200));  
            // 生成随机类  
            Random random = new Random();  
            for (int i = 0; i < 155; i++) {  
                int x2 = random.nextInt(width);  
                int y2 = random.nextInt(height);  
                int x3 = random.nextInt(12);  
                int y3 = random.nextInt(12);  
                g.drawLine(x2, y2, x2 + x3, y2 + y3);  
            }  
  
            // 将认证码显示到图象中  
            g.setColor(new Color(20 + random.nextInt(110), 20 + random  
                    .nextInt(110), 20 + random.nextInt(110)));  
  
            g.drawString(s, 2, 16);  
  
            // 图象生效  
            g.dispose();  
            // 输出图象到页面  
            ImageIO.write((BufferedImage) image, "JPEG", out);  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return null;  
    }  
  
    private Color getRandColor(int fc, int bc) { // 给定范围获得随机颜色  
        Random random = new Random();  
        if (fc > 255)  
            fc = 255;  
        if (bc > 255)  
            bc = 255;  
        int r = fc + random.nextInt(bc - fc);  
        int g = fc + random.nextInt(bc - fc);  
        int b = fc + random.nextInt(bc - fc);  
        return new Color(r, g, b);  
    }  

	public void setServletContext(ServletContext arg0) {

	}

}
